{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "c05c0fc1",
   "metadata": {},
   "source": [
    "# Jina Reranker"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9cdcfd8f",
   "metadata": {},
   "source": [
    "이 노트북은 문서 압축 및 `retrieval`을 위해 **Jina Reranker**를 사용하는 방법을 보여줍니다.\n",
    "\n",
    "- [API 키 발급](https://jina.ai/reranker)\n",
    "\n",
    "`.env` 파일에 아래와 같이 추가합니다.\n",
    "\n",
    "```\n",
    "JINA_API_KEY=\"YOUR_JINA_API_KEY\"\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b1186b65",
   "metadata": {},
   "outputs": [],
   "source": [
    "# API KEY를 환경변수로 관리하기 위한 설정 파일\n",
    "from dotenv import load_dotenv\n",
    "\n",
    "# API KEY 정보로드\n",
    "load_dotenv()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4c16bad3",
   "metadata": {},
   "outputs": [],
   "source": [
    "# LangSmith 추적을 설정합니다. https://smith.langchain.com\n",
    "# !pip install langchain-teddynote\n",
    "from langchain_teddynote import logging\n",
    "\n",
    "# 프로젝트 이름을 입력합니다.\n",
    "logging.langsmith(\"Reranker\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "342398fd",
   "metadata": {},
   "source": [
    "## Jina Reranker"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f9df5cbc",
   "metadata": {},
   "source": [
    "간단한 예시를 위한 데이터를 로드하고 retriever 를 생성합니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f7f8eafa",
   "metadata": {},
   "outputs": [],
   "source": [
    "def pretty_print_docs(docs):\n",
    "    print(\n",
    "        f\"\\n{'-' * 100}\\n\".join(\n",
    "            [f\"Document {i+1}:\\n\\n\" + d.page_content for i, d in enumerate(docs)]\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "742b2501",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_community.document_loaders import TextLoader\n",
    "from langchain_community.vectorstores import FAISS\n",
    "from langchain_text_splitters import RecursiveCharacterTextSplitter\n",
    "from langchain_openai import OpenAIEmbeddings\n",
    "\n",
    "# 문서 로드\n",
    "documents = TextLoader(\"./data/appendix-keywords.txt\").load()\n",
    "\n",
    "# 텍스트 분할기 초기화\n",
    "text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100)\n",
    "\n",
    "# 문서 분할\n",
    "texts = text_splitter.split_documents(documents)\n",
    "\n",
    "# 검색기 초기화\n",
    "retriever = FAISS.from_documents(texts, OpenAIEmbeddings()).as_retriever(\n",
    "    search_kwargs={\"k\": 10}\n",
    ")\n",
    "\n",
    "# 질의문\n",
    "query = \"Word2Vec 에 대해서 설명해줘.\"\n",
    "\n",
    "# 문서 검색\n",
    "docs = retriever.invoke(query)\n",
    "\n",
    "# 문서 출력\n",
    "pretty_print_docs(docs)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0c9eb8c1",
   "metadata": {},
   "source": [
    "## JinaRerank를 사용한 재정렬 수행"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "07febbaf",
   "metadata": {},
   "source": [
    "이제 `Jina Reranker`를 압축기로 사용하여 기본 `retriever`를 `ContextualCompressionRetriever`로 감싸봅시다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f468e293",
   "metadata": {},
   "outputs": [],
   "source": [
    "from ast import mod\n",
    "from langchain.retrievers import ContextualCompressionRetriever\n",
    "from langchain_community.document_compressors import JinaRerank\n",
    "\n",
    "# JinaRerank 압축기 초기화\n",
    "compressor = JinaRerank(model=\"jina-reranker-v2-base-multilingual\", top_n=3)\n",
    "\n",
    "# 문서 압축 검색기 초기화\n",
    "compression_retriever = ContextualCompressionRetriever(\n",
    "    base_compressor=compressor, base_retriever=retriever\n",
    ")\n",
    "\n",
    "# 관련 문서 검색 및 압축\n",
    "compressed_docs = compression_retriever.invoke(\"Word2Vec 에 대해서 설명해줘.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "920a0022",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 압축된 문서의 보기 좋게 출력\n",
    "pretty_print_docs(compressed_docs)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "langchain-kr-lwwSZlnu-py3.11",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
